//
// Created by Scott_Z on 2025/4/16.
//

#ifndef THREADPOOL_TREADPOOL_H
#define THREADPOOL_TREADPOOL_H

#include <vector>
#include <queue>
#include <memory>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <thread>
#include <iostream>
//任务抽象类
//用户可以自定义任意任务类型,从Task类型,重写run方法,实现自定义任务处理
class Task{
public:
     virtual void run()=0;
};

//线程池支持的模式
enum class PoolMode
{
    MODE_FIEED, //固定数量的线程
    MODE_CACHED //线程可动态增长
};

//线程类型
class  Thread
{
public:
    //线程函数对象类型
    using ThreadFunc=std::function<void()>;

    //线程构造
    Thread(ThreadFunc func);
    ~Thread();
    //启动线程
    void start();
private:
    ThreadFunc func_;
};

//线程池类型
class ThreadPool
{
public:
    ThreadPool();
    ~ThreadPool();

    //设置线程池工作模式
    void setMode(PoolMode poolMode);
    //开启线程池
    void start(int initThreadSize=4);

    //设置task任务队列上线阈值
    void setTaskQueMaxThreshHold(int threshHold);

    //给线程池提交任务
    void submitTask(std::shared_ptr<Task> sp);

    ThreadPool(const ThreadPool&)=delete;
    ThreadPool& operator=(const ThreadPool&) = delete;


private:
    //定义线程函数
    void threadFunc();
private:
    std::vector<std::unique_ptr<Thread>> threads_;//线程列表
    size_t initThreadSize_;//初试的线程数量

    std::queue<std::shared_ptr<Task>> taskQue_;//任务队列
    std::atomic_uint taskSize_;//任务的数量
    int taskQueMaxThreshHold_;//任务队列的上线阈值

    std::mutex taskQueMtx_;//保证任务队列的线程安全
    std::condition_variable notFull_;//表示任务队列不满
    std::condition_variable notEmpty_;//表示任务队列不空

    PoolMode poolMode_;//当前线程池工作模式
};


#endif //THREADPOOL_TREADPOOL_H


